package com.powernode.task;

import com.powernode.constant.Constants;
import com.powernode.entity.Goods;
import com.powernode.service.GoodsService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;

/**
 * 商品 定时 执行任务类
 * @EnableScheduling : 添加定时任务支持
 */
@Component
@Slf4j
@EnableScheduling
public class GoodsTask {

    @Resource
    private GoodsService goodsService;

    @Resource
    private RedisTemplate redisTemplate;

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 查询和更新 商品信息到redis的任务
     * 查询 商品信息
     * 将商品信息存入 redis
     * 将商品数量 存入 redis
     * cron表达式  : cron表达式是一种用于指定任务在某个时间点或周期性执行的字符串表达式
     * 每三秒执行一次的cron表达式 : 0/3 * * * * ?
     */
    @Scheduled(cron = "0/3 * * * * ?")
    public void selAndUpdTask() {
        log.info("每三秒执行一次 查询和更新 商品信息到redis的任务");
        // 查询 商品信息   this.getBaseMapper().selectList(queryWrapper);
        List<Goods> goodsList = goodsService.list();
        // 遍历 , 将商品逐个更新到redis当中去
        goodsList.forEach(goods -> {
            // 将商品 添加到 redis
            String goodskey = Constants.REDIS_GOODS + goods.getId();
            redisTemplate.opsForValue().set(goodskey, goods);
            // 将商品库存 添加到 redis中
            String storeKey = Constants.REDIS_STORE + goods.getId();
            // 当 key 存在时 就不更新修改了 , 避免数据回转
            stringRedisTemplate.opsForValue().setIfAbsent(storeKey, String.valueOf(goods.getStore()));
        });
    }
}
